home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Languguage OS 2
/
Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO
/
language
/
ici
/
ici.cpi
/
forall.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-10-27
|
4KB
|
208 lines
#include "exec.h"
#include "struct.h"
#include "set.h"
#include "forall.h"
#include "str.h"
#include "buf.h"
STATIC long
mark_forall(fa)
forall_t *fa;
{
register int i;
long mem;
objof(fa)->o_flags |= O_MARK;
mem = sizeof(forall_t);
for (i = 0; i < nels(fa->fa_objs); ++i)
{
if (fa->fa_objs[i] != NULL)
mem += mark(fa->fa_objs[i]);
}
return mem;
}
/*
* va vk ka kk aggr code => (os)
* => forall (xs)
*/
int
op_forall()
{
register forall_t *fa;
if (o_top[-2] == objof(&o_null))
{
o_top -= 6;
--x_top;
return 0;
}
if ((fa = talloc(forall_t)) == NULL)
return 1;
objof(fa)->o_type = &forall_type;
objof(fa)->o_tcode = TC_FORALL;
objof(fa)->o_flags = 0;
objof(fa)->o_nrefs = 0;
rego(fa);
fa->fa_index = -1;
fa->fa_code = *--o_top;
fa->fa_aggr = *--o_top;
fa->fa_kkey = *--o_top;
fa->fa_kaggr = *--o_top;
fa->fa_vkey = *--o_top;
fa->fa_vaggr = *--o_top;
x_top[-1] = objof(fa);
return 0;
}
/*
* forall => forall pc (xs)
* OR
* forall => (xs)
*/
int
exec_forall()
{
register forall_t *fa;
char n[30];
fa = forallof(x_top[-1]);
switch (fa->fa_aggr->o_tcode)
{
case TC_STRUCT:
{
register struct_t *s;
register slot_t *sl;
s = structof(fa->fa_aggr);
while (++fa->fa_index < s->s_nslots)
{
if ((sl = &s->s_slots[fa->fa_index])->sl_key == NULL)
continue;
if (fa->fa_vaggr != objof(&o_null))
{
if (assign(fa->fa_vaggr, fa->fa_vkey, sl->sl_value))
return 1;
}
if (fa->fa_kaggr != objof(&o_null))
{
if (assign(fa->fa_kaggr, fa->fa_kkey, sl->sl_key))
return 1;
}
goto next;
}
}
goto fin;
case TC_SET:
{
register set_t *s;
register object_t **sl;
s = setof(fa->fa_aggr);
while (++fa->fa_index < s->s_nslots)
{
if (*(sl = &s->s_slots[fa->fa_index]) == NULL)
continue;
if (fa->fa_kaggr == objof(&o_null))
{
if (fa->fa_vaggr != objof(&o_null))
{
if (assign(fa->fa_vaggr, fa->fa_vkey, *sl))
return 1;
}
}
else
{
if (fa->fa_vaggr != objof(&o_null))
{
if (assign(fa->fa_vaggr, fa->fa_vkey, objof(o_one)))
return 1;
}
if (assign(fa->fa_kaggr, fa->fa_kkey, *sl))
return 1;
}
goto next;
}
}
goto fin;
case TC_ARRAY:
{
register array_t *a;
register int_t *i;
a = arrayof(fa->fa_aggr);
if (++fa->fa_index >= a->a_top - a->a_base)
goto fin;
if (fa->fa_vaggr != objof(&o_null))
{
if (assign(fa->fa_vaggr, fa->fa_vkey, a->a_base[fa->fa_index]))
return 1;
}
if (fa->fa_kaggr != objof(&o_null))
{
if ((i = new_int((long)fa->fa_index)) == NULL)
return 1;
if (assign(fa->fa_kaggr, fa->fa_kkey, i))
return 1;
loose(i);
}
}
goto next;
case TC_STRING:
{
register string_t *s;
register int_t *i;
s = stringof(fa->fa_aggr);
if (++fa->fa_index >= s->s_nchars)
goto fin;
if (fa->fa_vaggr != objof(&o_null))
{
if ((s = new_name(&s->s_chars[fa->fa_index], 1)) == NULL)
return 1;
if (assign(fa->fa_vaggr, fa->fa_vkey, s))
return 1;
loose(s);
}
if (fa->fa_kaggr != objof(&o_null))
{
if ((i = new_int((long)fa->fa_index)) == NULL)
return 1;
if (assign(fa->fa_kaggr, fa->fa_kkey, i))
return 1;
loose(i);
}
}
goto next;
}
sprintf(buf, "attempt to forall over %s", objname(n, fa->fa_aggr));
error = buf;
return 1;
next:
if ((*x_top = objof(new_pc(arrayof(fa->fa_code)))) == NULL)
return 1;
++x_top;
return 0;
fin:
--x_top;
return 0;
}
STATIC
type_t forall_type =
{
mark_forall,
free_simple,
hash_unique,
cmp_unique,
copy_simple,
assign_simple,
fetch_simple,
"forall"
};